cmake_minimum_required(VERSION 3.27)
project(LEPF
    VERSION 0.0.1
    LANGUAGES C CXX
)
##
# 支持以库文件或源代码的形式引入模块
# 注意要是使用源代码的形式，子模块的导入一定要添加在生成target文件之后
##
# 解决生成可执行文件中文乱码问题
add_compile_options("/source-charset:utf-8")    # 解决编码导致的编译不通过
add_compile_options("/execution-charset:utf-8") # 解决程序运行时乱码

# 编译类型 STATIC—编译为静态库 SHARED—编译为动态库 SOURCE—以源代码的形式链接到项目中
set(LEPF_BUILD_TYPE "STATIC")
# debug编译添加d后缀
set(CMAKE_DEBUG_POSTFIX d)
# 设置文件夹名称，用于在IDE中整理目标
set(CMAKE_FOLDER ${PROJECT_NAME})
# 将当前源目录（CMAKE_CURRENT_SOURCE_DIR）和构建目录（CMAKE_CURRENT_BINARY_DIR）添加到包含路径中
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# 引入CMake模块
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(MSVCFilters)

option(LEPF_BUILD_LIBRARY "LEPF编译为库文件，默认编译静态库文件" ON) # 是否以库文件的形式链接
option(LEPF_BUILD_SHARED_LIBRARY "LEPF编译为动态库文件" OFF)       # 是否以动态库的形式链接

# 如果是MSVC[Visual Studio]构建项目，则启用文件夹
if(MSVC)
    # 启用目录结构
    set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    # 如果当前用于构建CMake版本小于3.8，则使用传统的方式在VS中创建过滤器；否则使用TREE语法创建过滤器
    if(CMAKE_VERSION VERSION_LESS "3.8")
        GenerateMSVCFilters(${CMAKE_CURRENT_SOURCE_DIR}/src src)
    else()
        file(GLOB_RECURSE MODULE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.*)
        source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${MODULE_SRC})
    endif()
else()
    # 禁用目录结构
    set_property(GLOBAL PROPERTY USE_FOLDERS OFF)
endif()

# 查找QT5开发包
find_package(Qt5 COMPONENTS Widgets REQUIRED)

# 指定头文件所在位置 Qt5Widgets_INCLUDE_DIRS QTWidgets所依赖头文件位置
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${Qt5Widgets_INCLUDE_DIRS}
)

if(LEPF_BUILD_LIBRARY)
    message(STATUS "LEPF build library Enable.")
    # 生成动态库还是静态库
    if(LEPF_BUILD_SHARED_LIBRARY)
        message(STATUS "LEPF build shared library Enable.")
        set(LEPF_BUILD_TYPE "SHARED")
        add_definitions(-DDLL_EXPORTS) # 生成动态库需要提供DLL_EXPORTS声明，否则Windows下编译不过
    else()
        message(STATUS "LEPF build shared library Disable.")
    endif()
    add_library(${PROJECT_NAME} ${LEPF_BUILD_TYPE})
else()
    message(STATUS "LEPF build library Disable.")
    # 如果不启用库的形式链接该模块，则需要把该模块的引入写在添加可执行程序（ADD_EXECUTABLE）前面
endif()

include(Tools)

GetProTargetName(ProName)
# 链接QT库  Qt5Widgets_LIBRARIES Widgets库的名称
target_link_libraries(${ProName} ${Qt5Widgets_LIBRARIES})

# 主框架代码
add_subdirectory(
    ${CMAKE_CURRENT_SOURCE_DIR}/src
)
